Ext.require(['*']);

Ext.define('modelTipos_Items', {
	extend: 'Ext.data.Model',
	proxy : {
		type : 'ajax',
		//actionMethods : 'POST',
		//url : '/roles', //application/controllers/Habitacion.php
		
		api: {
			read: '/tipos_items/view',
			create: '/tipos_items/create',
			save: '/tipos_items/update',
			destroy: '/tipos_items/destroy'
		},
	
		reader: {	
			type: 'json',
			successProperty: 'success',
			root: 'tipos_items',
			messageProperty: 'message'
        },
		writer: {
			type: 'json',
			writeAllFields: false,
			root: 'tipo_item'
		},
		
	},
	
	fields: [
		{type: 'int' , name: 'idTipo_Item'},
		{type: 'string', name: 'nombreTipo_Item'},
		{type: 'string', name: 'descripTipo_Item'},
		{type: 'string', name: 'observTipo_Item'}
	]
});

Ext.define('modelAtributos', {
	extend: 'Ext.data.Model',
	proxy : {
		type : 'ajax',
		//actionMethods : 'GET',
		url : '/atributos/view', //application/controllers/Habitacion.php
		
		api: {
			read: '/atributos/view',
			create: '/atributos/create',
			save: '/atributos/update',
			destroy: '/atributos/destroy'
		},
		
		reader: {
			//actionMethods : 'GET',
			type : 'json',
			idProperty : 'idAtributo',
			root : 'atributos',
			totalProperty : 'totalAtributos'
		}
	},
	fields: [
		{type: 'int' , name: 'idAtributo'},
		{type: 'string', name: 'nombreAtributo'},
		{type: 'string', name: 'datoAtributo'},
		{type: 'string', name: 'observAtributo'}
	]
}); 


Ext.define('Tipo_ItemLiveSearchGridPanel', {
    extend: 'Ext.ux.LiveSearchGridPanel',
    
    initComponent: function() {
        
        //Ext.Msg.alert('Estoy en el initComponet del live!!!');
        var me = this;
        me.tbar = ['Buscar',{
                 xtype: 'textfield',
                 name: 'searchField',
                 hideLabel: true,
                 width: 200,
                 listeners: {
                     change: {
                         fn: me.onTextFieldChange,
                         scope: this,
                         buffer: 100
                     }
                 }
            }, {
                xtype: 'button',
                text: '<',
                tooltip: 'Anterior',
                handler: me.onPreviousClick,
                scope: me
            },{
                xtype: 'button',
                text: '>',
                tooltip: 'Siguiente',
                handler: me.onNextClick,
                scope: me
            }, '-', {
                xtype: 'checkbox',
                hideLabel: true,
                margin: '0 0 0 4px',
                handler: me.regExpToggle,
                scope: me                
            }, 'Expresión Regular', {
                xtype: 'checkbox',
                hideLabel: true,
                margin: '0 0 0 4px',
                handler: me.caseSensitiveToggle,
                scope: me
            }, 'Detectar Mayúsculas'];
        
        me.callParent(arguments);
    }
});

Ext.define('App.view.GesTipos_Items', {
	extend: 'Ext.panel.Panel',
    alias: 'widget.tabfirst',
    title: 'Administación de Tipos_Items',
	layout:'anchor',
	
	initComponent: function () {
		//para que funcionen los toolTips
        Ext.QuickTips.init();
        
        this.StoreTipos_Items = Ext.create('Ext.data.Store', {
			model : 'modelTipos_Items'
			//autoLoad : true
		});
		
		this.myIdProyecto = idProyectoAux;
		this.myNombreProyecto = nombreProyectoAux;
		
		this.StoreTipos_Items.load(
			    {
				    params:{idProyecto: idProyectoAux}
			    }
	    );
		//DataStore para el ComboBox de la lista de Atributos
		/*this.dsCmbAtributos = Ext.create('Ext.data.Store', {
			model : 'modelAtributosTipos_Items',
			autoLoad : true
		});
	
		//ComboBox para mostrar atributos disponibles
		this.cmbAtributos = Ext.create(/*'Ext.form.ComboBox''Ext.ux.form.field.BoxSelect', {
						
			fieldLabel: 'Atributos',
			name : 'cmb_atributos',
			id: 'id_cmbx_atributos',
			displayField: 'nombreAtributo',
			width: 500,
			height: 70,
			//labelWidth: 130,
			store: this.dsCmbAtributos,
			queryMode: 'local',
			emptyText: 'Seleccione los Atributos a ser asignados',
			valueField: 'idAtributo',
			multiSelect :true,
			allowBlank : false
			
		});*/
		
		this.idBtonCrearTipoItem = 'btn_grid_agregar_tipo_item' + this.myIdProyecto;
		this.idBtonEditarTipoItem = 'btn_grid_editar_tipo_item' + this.myIdProyecto;
		this.idBtonEliminarTipoItem = 'btn_grid_eliminar_tipo_item' + this.myIdProyecto;
		
		this.TblGridTipo_ItemEdit_tipos_items = Ext.create('Ext.toolbar.Toolbar',{
			items : 
			[
				{
					xtype : 'button',
					id : this.idBtonCrearTipoItem,
					itemId : this.idBtonCrearTipoItem,
					text : 'Agregar Tipo de Item',
	
					iconCls : 'icon_button_add',
					disabled : false,
					tooltip : 'Agregar un Nuevo Tipo de Item',
					scope : this,
					handler : this.AgregarRecordSelect
				},
				{
					xtype : 'tbseparator'
				},
				{
					xtype : 'button',
					id : this.idBtonEditarTipoItem,
					itemId : this.idBtonEditarTipoItem,
					text : 'Editar Registro',
					iconCls : 'icon_btn_grid_editar_tipo_item',
					disabled : true,
					tooltip : 'Editar el tipo de item seleccionado',
					scope : this,
					handler : this.EditRecordSelect
				},
				{
					xtype : 'tbseparator'
				},
				{
					xtype : 'button',
					id : this.idBtonEliminarTipoItem,
					itemId : this.idBtonEliminarTipoItem,
					text : 'Eliminar Tipo de Item',
					iconCls : 'icon_btn_grid_eliminar',
					disabled : true,
					tooltip : 'Eliminar el tipo de item seleccionado',
					scope : this,
					handler : this.EliminarRecordSelect
				}
			]
		});
		
		this.GridTipos_Items = Ext.create(/*'Ext.grid.Panel'*/'Tipo_ItemLiveSearchGridPanel',{
			title : 'Lista de Tipos de Items : ' + this.myNombreProyecto,
			frame : true,
			store : this.StoreTipos_Items,
			stripeRows : true,
			columnLines: true,
			loadMask : true,
			//width : 550,
			//height : 400,
			dockedItems : [this.TblGridTipo_ItemEdit_tipos_items,
				Ext.create('Ext.ux.StatusBar', {
				defaultText: this.defaultStatusText,
				name: 'searchStatusBar'
				})
			],
			//flex:4,
			//x:250,
			//y:100,
			anchor: '100% 90%', 
			//plugins: [new Ext.ux.grid.GridHeaderFilters()],
			columns : 
			[
				Ext.create('Ext.grid.RowNumberer'),
				{
					text : "idTipo_Item",
					dataIndex : 'idTipo_Item',
					hidden : true
				},
				{ 
					text : "Tipo de Item",
					dataIndex : "nombreTipo_Item",
					sortable : false,
					resizable : false,
					width : 150
				},
				{
					text : "Descripción",
					dataIndex : "descripTipo_Item",
					sortable : false,
					resizable : false,
					width : 200
				},
				{
					text : "Observación",
					dataIndex : "observTipo_Item",
					sortable : false,
					resizable : false,
					width : 100
				}
			],
			listeners : {
				scope : this, //El ámbito de aplicación (la referencia) en el que se ejecuta el controlador.
				'selectionchange': function(view, records) {
					//Activar los botones del DataGrid
					//La propiedad #btn_grid_editar corresponde al itemId asignado al item en el componente Toolbar del DataGrid
					this.GridTipos_Items.down('#'+this.idBtonEditarTipoItem).setDisabled(!records.length);
					this.GridTipos_Items.down('#'+this.idBtonEliminarTipoItem).setDisabled(!records.length);
				}
			},
			bbar: Ext.create('Ext.PagingToolbar', {
				store : this.StoreTipos_Items,
				displayInfo : true,
				displayMsg : 'Mostrando registros {0} - {1} de {2}',
				emptyMsg : "Sin registros para mostrar"
			})	
		});
		this.items = [this.GridTipos_Items];
        this.callParent(arguments);
        								
	},
	
	AgregarRecordSelect : function(){
		
		var dsCmbAtributos = Ext.create('Ext.data.Store', {
			model : 'modelAtributos',
			autoLoad : true
		});
	
		//ComboBox para mostrar atributos disponibles
		var cmbAtributos = Ext.create(/*'Ext.form.ComboBox'*/'Ext.ux.form.field.BoxSelect', {
						
			fieldLabel: 'Atributos',
			name : 'cmb_atributos',
			id: 'id_cmbx_atributos',
			displayField: 'nombreAtributo',
			width: 500,
			height: 70,
			//labelWidth: 130,
			store: dsCmbAtributos,
			queryMode: 'local',
			emptyText: 'Seleccione los Atributos a ser asignados',
			valueField: 'idAtributo',
			multiSelect :true,
			allowBlank : false
			
		});
	
		//Creamos el FormPanel que contendra los datos a agregar
		this.FormAddModal = Ext.create('Ext.form.Panel',{
			frame :true,
			title : 'Datos del Tipo de Item',
			bodyStyle :'padding:5px 5px 0',
			width : 550,
			height : 250,
			defaultType: 'textfield',
			items: [{
					fieldLabel : 'Nombre',
					id : 'nombreAdd',
					name : 'nombreAdd',
					anchor : '90%',
					allowBlank : false
				},{
					fieldLabel : 'Descripcion',
					id : 'descripAdd',
					name : 'descripAdd',
					anchor : '90%',
					hidden : false,
					allowBlank : false
				},{
					fieldLabel : 'Observación',
					id : 'observAdd',
					name : 'observAdd',
					anchor : '90%',
					hidden : false,
					allowBlank : true
				},{
					xtype : 'fieldcontainer',
					labelStyle : 'font-weight:bold;padding:0',
					items: [
						cmbAtributos,
					]
			}],
			buttons: [{
				text : 'Guardar',
				id : 'id_btn_add_guardar_tipo_item',
				iconCls : 'icon_button_save',
				scope : this,
				handler : this.HandlerGuardarDatosTipo_Item
				},{
				text : 'Cancelar',
				id : 'id_btn_add_cancelar_tipo_item',
				iconCls : 'icon_button_cancel',
				scope : this,
				handler : function(){
					this.WindowFormAddModal.close();
				}
			}]
		});
		
		//Una vez creado el FormPanel lo reseteamos
		this.FormAddModal.getForm().reset();
		
		//Creamos la ventana que contendra el FormaPanel creado anteriormente
		this.WindowFormAddModal = Ext.create('Ext.window.Window',{
			title : 'Agregar Nuevo Tipo de Item',
			bodyStyle : 'padding:10px 10px 10px 10px',
			region : 'center',
			width : 580,
			height : 300,
			modal : true,
			//resizable : false,
			draggable : false,
			closable : true,
			closeAction : 'destroy',
			items : [this.FormAddModal]
		});
		
		//Mostramos la ventana con el formulario de edicion y los datos del registro seleccionado
		this.WindowFormAddModal.show();
		
	},
	
	//Funcion para mostrar la ventana con el formulario de edicion
	//El formulario de edicion contiene los datos del registro seleccionado para su edicion
	EditRecordSelect : function(){
		
		var dsCmbAtributos = Ext.create('Ext.data.Store', {
			model : 'modelAtributos',
			autoLoad : true
		});
	
		//ComboBox para mostrar atributos disponibles
		var cmbAtributos = Ext.create(/*'Ext.form.ComboBox'*/'Ext.ux.form.field.BoxSelect', {
						
			fieldLabel: 'Atributos',
			name : 'cmb_atributos',
			id: 'id_cmbx_atributos',
			displayField: 'nombreAtributo',
			width: 500,
			height: 70,
			//labelWidth: 130,
			store: dsCmbAtributos,
			queryMode: 'local',
			emptyText: 'Seleccione los Atributos a ser asignados',
			valueField: 'idAtributo',
			multiSelect :true,
			allowBlank : false
			
		});
		
		//Creamos el FormPanel que contendra los datos a editar
		this.FormEditModal = Ext.create('Ext.form.Panel',{
			frame :true,
			title : 'Datos del Tipo de Item',
			bodyStyle :'padding:5px 5px 0',
			width : 550,
			height : 250,
			/*fieldDefaults: {
				msgTarget : 'side',
				labelWidth : 120,
				labelStyle : 'font-size:11px;',
				fieldStyle : 'font-size:11px;'
			},*/
			defaultType: 'textfield',
			items: [{
				//fieldLabel : 'Id Habitacion',
				id : 'idTipo_Item',
				name : 'idTipo_Item',
				anchor : '50%',
				hidden : true,
				allowBlank : false
				},{
				fieldLabel : 'Nombre del Tipo de Item',
				id : 'nombreTipo_Item',
				name : 'nombreTipo_Item',
				anchor : '90%',
				allowBlank : false
				},{
				fieldLabel : 'Descripción del Tipo de Item',
				id : 'descripTipo_Item',
				name : 'descripTipo_Item',
				anchor : '90%',
				hidden : false,
				allowBlank : false
				},{
				fieldLabel : 'Observación del Tipo de Item',
				id : 'observTipo_Item',
				name : 'observTipo_Item',
				anchor : '90%',
				hidden : false,
				allowBlank : true
				},{
					xtype : 'fieldcontainer',
					labelStyle : 'font-weight:bold;padding:0',
					items:	[
						cmbAtributos,
					]
				}
			],
			buttons: [{
				text : 'Guardar',
				id : 'id_btn_editar_guardar_tipo_item',
				iconCls : 'icon_button_save',
				scope : this,
				handler : this.HandlerActualizarDatosTipo_Item
				},{
				text : 'Cancelar',
				id : 'id_btn_editar_cancelar_tipo_item',
				iconCls : 'icon_button_cancel',
				scope : this,
				handler : function(){
					this.WindowFormEditModal.close();
				}
			}]
		});
		//Una vez creado el FormPanel lo reseteamos
		this.FormEditModal.getForm().reset();
		//Obtenemos el registro seleccionado del Grid
		registroSeleccionado = this.GridTipos_Items.getSelectionModel().getSelection()[0].data.idTipo_Item;
		
		//setamos los valores del grit a ser editados
		Ext.getCmp('idTipo_Item').setValue(this.GridTipos_Items.getSelectionModel().getSelection()[0].data.idTipo_Item);
		Ext.getCmp('nombreTipo_Item').setValue(this.GridTipos_Items.getSelectionModel().getSelection()[0].data.nombreTipo_Item),
		Ext.getCmp('descripTipo_Item').setValue(this.GridTipos_Items.getSelectionModel().getSelection()[0].data.descripTipo_Item),
		Ext.getCmp('observTipo_Item').setValue(this.GridTipos_Items.getSelectionModel().getSelection()[0].data.observTipo_Item),
		
		//traemos los atributos que tiene el tipo_item que estamos editando
		Ext.Ajax.request(
		{
			url:'/atributos/editarTipo_Item',
			//form:"[STICK FORM ID HERE]",
			method:'GET',
			scope : this,
			params: { idTipo_Item: this.GridTipos_Items.getSelectionModel().getSelection()[0].data.idTipo_Item},
			success: function(response, opts) {
				//alert("successfull");
				obj = Ext.decode(response.responseText)
				Ext.getCmp('id_cmbx_atributos').setValue(obj.atributos)	
				
			},
			failure:function(res,opt) {
				alert("request failed");
			}
		});
		
		//Creamos la ventana que contendra el FormaPanel creado anteriormente
		this.WindowFormEditModal = Ext.create('Ext.window.Window',{
			title : 'Editar registro seleccionado',
			bodyStyle : 'padding:10px 10px 10px 10px',
			region : 'center',
			width : 580,
			height : 300,
			modal : true,
			//resizable : false,
			draggable : false,
			closable : true,
			closeAction : 'destroy',
			items : [this.FormEditModal]
		});
		//this.dsCmbAtributos.load();
		//Mostramos la ventana con el formulario de edicion y los datos del registro seleccionado
		this.WindowFormEditModal.show();
	},
	
	EliminarRecordSelect : function(){
		Ext.MessageBox.show({
			title : "Información del sistema",
			msg : "¿Realmente desea eliminar el registro seleccionado?",
			buttons : Ext.MessageBox.YESNO,
			icon : Ext.MessageBox.INFO,
			scope : this,
			fn : this.EliminarRegistroSeleccionado,
			width : 400
		});
	},
    
    EliminarRegistroSeleccionado : function(btn){
		if (btn == 'yes') { //btn=='yes'
			//WindowAdmUsuarios.el.mask('Eliminando datos....Espere por favor...');			
			registroSeleccionado = this.GridTipos_Items.getSelectionModel().getSelection()[0].data.idTipo_Item;
			Ext.Ajax.request({
				url : '/tipos_items/destroy', //application/controllers/Habitacion.php
				method : 'POST',
				scope : this,
				params : {
					param_id : registroSeleccionado
				},
				success: function(response, opts) { //success
					var obj = Ext.JSON.decode(response.responseText);
					if(obj.success==true){
						this.StoreTipos_Items.load(
							{
								params:{idProyecto: this.myIdProyecto}
							}
						);
						//this.WindowAdmUsuarios.el.unmask();
					}
					else if(obj.success==false){
						//this.WindowAdmUsuarios.el.unmask();
							Ext.MessageBox.show({
								title : "Info",
								msg : obj.msg,
								buttons : Ext.MessageBox.OK,
								icon : Ext.MessageBox.ERROR,
								width : 400
							});
					}
					else{
						//this.WindowAdmUsuarios.el.unmask();
						Ext.MessageBox.show({
							title : "Informacion del sistema",
							msg : "Mensaje de error alternativo a la eliminacion del registro seleccionado",
							buttons : Ext.MessageBox.OK,
							icon : Ext.MessageBox.ERROR,
							width : 400
						});
					}
				}, //success
				failure: function(response, opts) { //failure
					//this.WindowAdmUsuarios.el.unmask();
					var obj = Ext.JSON.decode(response.responseText);
						Ext.MessageBox.show({
							title : "Informacion del sitema",
							msg : "Error de conexion al servidor de la base de datos",
							buttons : Ext.MessageBox.OK,
							icon : Ext.MessageBox.ERROR,
							width : 400
						});
				} //failure
			});
		}else{
	
		}
	},
	
	HandlerGuardarDatosTipo_Item:function(){
				//Ext.Msg.alert("Info",this.FormAddModal.getForm().isValid());
		if (this.FormAddModal.getForm().isValid()){
			//Ext.Msg.alert("Info","Pasé la validación");
			
			var rec = new modelTipos_Items({
				//idRol: Ext.getCmp('idRolAdd').getValue(),
				nombreTipo_Item: Ext.getCmp('nombreAdd').getValue(),
				descripTipo_Item: Ext.getCmp('descripAdd').getValue(),
				observTipo_Item: Ext.getCmp('observAdd').getValue()
			});
			
			this.FormAddModal.getForm().submit({
				method : 'POST',
				//type: "json",
				url : '/tipos_items/create', 
				clientValidation : true,
				scope : this,
				params : {
					idProyecto: this.myIdProyecto,
					ids_atributos : Ext.JSON.encode(Ext.getCmp('id_cmbx_atributos').getValue()),
					tipo_item : Ext.JSON.encode(rec)
				},
				success: function(form, action){
						this.WindowFormAddModal.close();
						this.StoreTipos_Items.load(
							{
								params:{idProyecto: this.myIdProyecto}
							}
						);
				},
				failure: function(form, action){
					Ext.MessageBox.show({
						title : 'Error',
						msg : action.result.msg,
						buttons : Ext.MessageBox.OK,
						icon : Ext.MessageBox.ERROR,
						width : 350
					});
				} //End failure
			});
		}
	},
	
	HandlerActualizarDatosTipo_Item:function(){
		if (this.FormEditModal.getForm().isValid()){
			//Ext.Msg.alert("Info","Actualizar los datos del formulario");
			
			var rec = new modelTipos_Items({
				idTipo_Item: Ext.getCmp('idTipo_Item').getValue(),
				nombreTipo_Item: Ext.getCmp('nombreTipo_Item').getValue(),
				descripTipo_Item: Ext.getCmp('descripTipo_Item').getValue(),
				observTipo_Item: Ext.getCmp('observTipo_Item').getValue()
			});
			
			//rec.create();
			
			//this.StoreRoles.insert(0, rec);
			//this.StoreRoles.load();
			
			this.FormEditModal.getForm().submit({
				method : 'POST',
				//type: "json",
				url : '/tipos_items/update', //application/controllers/Habitacion.php
				clientValidation : true,
				scope : this,
				params : {
					tipo_item : Ext.JSON.encode(rec),
					ids_atributos: Ext.JSON.encode(Ext.getCmp('id_cmbx_atributos').getValue()),
				},
				success: function(form, action){
					this.WindowFormEditModal.close();
					this.StoreTipos_Items.load(
						{
							params:{idProyecto: this.myIdProyecto}
						}
					);
				},
				failure: function(form, action){
					Ext.MessageBox.show({
						title : 'Error',
						msg : action.result.msg,
						buttons : Ext.MessageBox.OK,
						icon : Ext.MessageBox.ERROR,
						width : 350
					});
				} //End failure
			});
		}
	},
});

